<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        1. Object.defineProperties()
            它接收两个参数:要为之添加或修改属性的对象和另一个描述符对象，其属性与要添加或修改的属性一一对应。
            唯一的区别是所有属性都是同时定义的，并且数据属性的 configurable、enumerable 和 writable 特性值都是 false。
     */

    let book = {}
    Object.defineProperties(book, {
        year_: {
            value: 2017
        },
        edition: {
            value: 1
        },
        year: {
            get() {
                return this.year_
            },
            set(newValue) {
                if (newValue > 2017) {
                    this.year_ = newValue;
                    this.edition += newValue - 2017
                }
            }
        }
    })
    
    delete book.edition
    console.log(book.edition)
    // 2.1.读取单个属性Object.getOwnPropertyDescriptor
    console.log(Object.getOwnPropertyDescriptor(book,'edition'))
    /*
        {value: 1, writable: false, enumerable: false, configurable: false}
     */
    // 2.2 读取所有Object.getOwnPropertyDescriptors,这个方法实际上 会在每个自有属性上调用 Object.getOwnPropertyDescriptor()
    console.log(Object.getOwnPropertyDescriptors(book))
    /*
    {year_: {…}, edition: {…}, year: {…}}
     */
    
</script>
</body>
</html>